ASP.NET MVC/WebApi 路由中包含英文句号(.)的问题.

momo314相同方式共享非商业用途署名转载

今天接到一个需求,要求 app 内的深度链接使用 http-url 的格式来定义,以便当 app 版本不够高,无法识别较新的深度链接的时候,可以将深度链接退化为一个http请求,打开一个升级页面。

深度链接的格式为:

https://demo.com/link/com.xxx.activity.WebViewActivity

我寻思着,虽然好久没有写过 MVC 了,但不就是配个路由的事儿吗,应该不难:

routes.MapRoute("DeepLink", 
    "link/{linkId}",
    new { controller = "DeepLink", action = "Index" }
);

然而,跑起来之后发现直接 404,细看了一下 404 页面,发现使用的是 StaticFileHandler,难道是被当成静态文件了?

嗯。。。也对,本质上 这个深度链接可以简化为

https://demo.com/link/xxx.png

该包含的要素一个都没少,所以被解析成静态文件也就不奇怪了,那么怎么改呢?

方案一、 修改 web.config 中的 modules

这也是网上被提及最多的方法,但是个人非常不推荐这种方法,因为这种修改会导致所有的请求(包括对静态文件的请求)全部都会被iis中已注册的模块接管,这其实非常没有必要。

<configuration>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />
    <system.webServer>
</configuration>

方案二、 向 web.config 中添加 handlers

<configuration>
  <system.webServer>
      <handlers>
        <add name="DeepLinkHandler-ISAPI-4.0_32bit" path="link/*.*" verb="GET" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
        <add name="DeepLinkHandler-ISAPI-4.0_64bit" path="link/*.*" verb="GET" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
        <add name="DeepLinkHandler-Integrated-4.0" path="link/*.*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
      </handlers>
  </system.webServer>
</configuration>

其实,我们只需要 handlers 中添加上述3个handler即可,从代码中很容易看出,这只针对打向指定Url(link/*.*)的指定请求(GET)生效。

✎﹏ 本文来自于 momo314和他们家的猫,文章原创,转载请注明作者并保留原文链接。